package c09泛型;

class Foo {
	//构造器也是方法，同样可以使用泛型
	public <T> Foo(T t) {
		System.err.println("t参数的值为：" + t);
	}
}

class MyClass<E> {
	public <T> MyClass(T t) {
		System.err.println("t参数的值为：" + t);
	}
}

public class 泛型构造器与Java7的菱形语法 {
	public static void main(String[] args) {
		//泛型构造器中的T参数自动推断为String。
		new Foo("疯狂Java讲义");
		//泛型构造器中的T参数自动推断为Integer。
		new Foo(200);

		//与普通方法不同，调用泛型构造器时可以指定类型，且<String>必须放在构造方法名前面！
		new <String>Foo("疯狂Android讲义");
//		new  Foo<String>("疯狂Android讲义");//编译错误！
//		new  Foo("疯狂Android讲义")<String>;//编译错误！

		//显式指定泛型构造器中的T参数为String，但是传给Foo构造器的实参是Double对象，下面代码出错
//		new <String> Foo(12.3);

		//MyClass类声明中的E形参是String类型。
		//泛型构造器中声明的T形参是Integer类型
		MyClass<String> mc1 = new MyClass<>(5);//Java7允许前面指定String时后面可以只用一个<>
		//同时显式指定泛型构造器中声明的T形参和类形参，
		MyClass<String> mc2 = new <Integer>MyClass<String>(5);

		//构造器和类的泛型形参要么都指定，要么都不指定！
//		MyClass<String> mc3 = new <Integer> MyClass<>(5);//错误！显式声明构造器泛型后就不能使用"菱形"语法。
	}
}
